LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

Transformer

2022/2/20

讲一下对transformer的理解。

参考视频链接:https://www.bilibili.com/video/BV1M44y1q7oq

首先是attention注意力机制,以图像举例,图像不同位置的东西我们的注意力是不一样的。通俗点讲就是一副图像我们肯定有关注的东西,也肯定有不关注,我们对不同部分的关注度是不一样的。现在我们需要用一种算法,让计算机帮我们知道,什么位置的注意力应该高,什么样的注意力应该低。而transformer就实现了这种算法。transformer本来是运用在NLP中的,你不能单纯对一个单词进行分析,因为同一个单词可能在不同的句子里是不一样的意思,不同的句子我们放的注意力的位置也是不一样的,也就是我们常说的理解句子要联系上下文。

transformer做的就是将一个向量(或者叫token)和包括自己在内的所有向量计算关系

然后重构成一个新向量。


举个例子:

向量1 向量2 向量3 向量4
向量1 0.5 0.2 0.2 0.1

这样子向量1就重构成

这样子每一个向量都包含了全局信息,也表示了自己在全局应该得到的注意力。

至于这些权重怎么算,就需要涉及到三个辅助向量q,k,vq,k,v

qq代表的是queries,用于自己计算自己和其他向量的关系。

kk代表的是keys,用于其他向量计算其他向量和自己的关系。

vv代表的是values,用于表示自己的特征。

q,k,vq,k,v都是通过输入xx训练出来的,q=Wqx,k=Wkx,v=Wvxq=W_q*x,k=W_k*x,v=W_v*x。对应的WW就是要训练的权重。

假设xix_i对应qi,ki,kiq_i,k_i,k_i,内积越大,两个向量关系就大,内积越小,两个向量关系就小。

为了表示方便,我用rr表示关系(relation),则x1x_1xix_i的关系可以表示为r1i=q1kir_{1i}=q_1k_i

因为xx各自之间可能维度不同,为了消除维度带来的影响,所以r1ir_{1i}还要除以dimi\sqrt{dim_i}

然后r1ir_{1i}经过softmaxsoftmax归一化得到(r_n)1i(r\_n)_{1i}nn代表归一化normalized。

x1x_1重构为i=1n(r_n)1ivi\sum_{i=1}^n(r\_n)_{1i}*v_i。其余依次类推。

以上就是transformer做得内容了。transformer作为一个backbone,可以广泛地运用到其他领域。



比如在计算机视觉中的应用,即Vision Transformer(Vit)。

Vit论文:https://arxiv.org/abs/2010.11929

Vit代码:https://github.com/google-research/vision_transformer

计算机视觉中很重要一点就是感受野,transformer提高了感受野,使得网络有观察全局的能力。

首先是需要将图像转化成一个个向量,这很简单。

只需要将图像分割成一块块,然后全连接就行了。

那么输入解决了,直接套用transformer就行了吗?

不是的。因为这样子就丢失了位置信息。

因为不论你分割完怎么排列,最后每个向量算出来的结果都是一样的。

而在图像中位置信息非常重要,分割完的每一块都有其特定的位置。

所以需要进行位置编码,将位置信息融入进去。

位置编码有一维的,例如把图片按1、2、3、…排列,

位置编码有二维的,例如把图片按坐标(1,1)、(1,2)、…排列,

理论上应该是二维编码效果比一维的好,但是论文中说实验表明,两者差不多。

不太符合直观感受,因为理论上“(2,1)和(1,1)” 比 “4和1”更能表示位置信息。

另外它还增加了一个0,添加进去一起训练,用于最终预测结果,如上图左侧。


总结一下transformer和cnn差别,

transformer增加了感受野,少层就能捕获到全局信息。而cnn需要多层堆叠,才能获得全局信息。

所以transformer对整副图像的特征提取就做得很好,在很多网络中都表现很好。

但是研究表明,transformer需要的数据量很大


补充一下Multi-Head Attention

简单来讲就是不同的东西对同一个东西的注意力是不一样的,

所以我们最好就是参考很多(Multi)东西对同个东西的注意力。

不同的初始化权重WW对应不同的q,k,vq,k,v,不同的q,k,vq,k,v对应不同输出。

我们要做的就是初始化多组用多组不同的输出,拼接,然后全连接。

这样子最终的输出就包含不同的q,k,vq,k,v对应的注意力的信息了,就会更全面。

其实就跟卷积使用多个卷积核是一样的道理。